#include <bits/stdc++.h>
#define ls (2*u)
#define rs (2*u+1)
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
using namespace std;
using ll=long long;
constexpr ll V=999999;
constexpr ll inf=0x3f3f3f3f3f3f3f3f;
struct Node{
	ll mx,lp,rp,add;
	friend Node operator+(const Node &A,const Node &B){
		Node C;
		C.mx=max(A.mx,B.mx);
		C.lp=A.mx==C.mx?A.lp:B.lp;
		C.rp=B.mx==C.mx?B.rp:A.rp;
		C.add=0;
		return C;
	}
};
struct Sgt{
	Node T[4*V];
	void upd(ll u,ll val){
		T[u].mx+=val;
		T[u].add+=val;
	}
	void pushdown(ll u){
		if(T[u].add!=0){
			upd(ls,T[u].add);
			upd(rs,T[u].add);
			T[u].add=0;
		}
	}
	void build(ll u,ll l,ll r){
		T[u].lp=l;
		T[u].rp=r;
		if(l==r){
			return;
		}
		ll mid=(l+r)>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
	}
	void update(ll u,ll l,ll r,ll x,ll y,ll val){
		if(x<=l&&r<=y){
			upd(u,val);
			return;
		}
		pushdown(u);
		ll mid=(l+r)>>1;
		if(x<=mid){
			update(ls,l,mid,x,y,val);
		}
		if(y>mid){
			update(rs,mid+1,r,x,y,val);
		}
		T[u]=T[ls]+T[rs];
	}
	Node query(){
		return T[1];
	}
}sgt;
struct Node2{
	ll ans,mxl,mnr;
	friend Node2 operator+(const Node2 &A,const Node2 &B){
		return {min(min(A.ans,B.ans),B.mnr-A.mxl+1),max(A.mxl,B.mxl),min(A.mnr,B.mnr)};
	}
};
struct Sgt2{
	Node2 T[4*V];
	multiset<ll,greater<ll>> mxl[V];
	multiset<ll> mnr[V];
	void build(ll u,ll l,ll r){
		T[u].ans=inf;
		T[u].mxl=-inf;
		T[u].mnr=inf;
		if(l==r){
			return;
		}
		ll mid=(l+r)>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
	}
	void updatel(ll u,ll l,ll r,ll x,ll y,ll val){
		if(l==r){
			if(val>0){
				mxl[x].insert(y);
			}
			else{
				mxl[x].erase(mxl[x].find(y));
			}
			T[u].mxl=mxl[x].empty()?-inf:*mxl[x].begin();
			return;
		}
		ll mid=(l+r)>>1;
		if(x<=mid){
			updatel(ls,l,mid,x,y,val);
		}
		else{
			updatel(rs,mid+1,r,x,y,val);
		}
		T[u]=T[ls]+T[rs];
	}
	void updater(ll u,ll l,ll r,ll x,ll y,ll val){
		if(l==r){
			if(val>0){
				mnr[x].insert(y);
			}
			else{
				mnr[x].erase(mnr[x].find(y));
			}
			T[u].mnr=mnr[x].empty()?inf:*mnr[x].begin();
			return;
		}
		ll mid=(l+r)>>1;
		if(x<=mid){
			updater(ls,l,mid,x,y,val);
		}
		else{
			updater(rs,mid+1,r,x,y,val);
		}
		T[u]=T[ls]+T[rs];
	}
	ll query_mxl(ll u,ll l,ll r,ll x){
		if(l==r){
			return T[u].mxl;
		}
		ll mid=(l+r)>>1;
		if(x<=mid){
			return query_mxl(ls,l,mid,x);
		}
		return query_mxl(rs,mid+1,r,x);
	}
	ll query_mnr(ll u,ll l,ll r,ll x){
		if(l==r){
			return T[u].mnr;
		}
		ll mid=(l+r)>>1;
		if(x<=mid){
			return query_mnr(ls,l,mid,x);
		}
		return query_mnr(rs,mid+1,r,x);
	}
	ll query_ans(){
		return T[1].ans;
	}
}sgt2;
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	freopen("stone.in","r",stdin);
	freopen("stone.out","w",stdout);
	ll q;
	cin>>q;
	ll cnt=0;
	sgt.build(1,1,V);
	sgt2.build(1,1,V);
	rep(i,1,q){
		char op;
		ll l,r;
		cin>>op>>l>>r;
		r--;
		if(op=='A'){
			cnt++;
			sgt.update(1,1,V,l,r,1);
			sgt2.updater(1,1,V,l,r,1);
			sgt2.updatel(1,1,V,r,l,1);
		}
		else if(op=='R'){
			cnt--;
			sgt.update(1,1,V,l,r,-1);
			sgt2.updater(1,1,V,l,r,-1);
			sgt2.updatel(1,1,V,r,l,-1);
		}
		Node ans=sgt.query();
		if(ans.mx==cnt){
			cout<<sgt2.query_mnr(1,1,V,ans.lp)-sgt2.query_mxl(1,1,V,ans.rp)+1<<'\n';
		}
		else{
			cout<<sgt2.query_ans()<<'\n';
		}
	}
	return 0;
}
/**
 * typeperf "\Process(stone)\Working Set Peak" -si 2
 * TODO: delete while(1);
 * TODO: multitest cleanup
 */
